# -*- coding:utf-8 -*-
"""
@Time:  2024/6/24 23:10
@Auth:  Mrs.Gou 
@Function:  Python自动化-po设计模式分层架构
"""
# po设计模式：是测试用例组织的一种模式
# 定义：po，就是页面对象化，使用po对页面进行抽象或者说建模的过程，需要把页面当做一个对象
# po思想-对页面进行抽象时，把页面的一个个功能设计为函数（用例），把页面上的操作（如点击，输入等）设计为函数实现（步骤）
# 分离页面操作需要的定位和数据，作为对象的属性
# 比如登录：
#       手机账号：登录成功、失败
#       邮箱账号：登录成功、失败
# 用例解耦合：
#       提供完整的初始化（前置）：比如登录，每次都重新打开网址，这样，就避免了之前输入过的信息需要清空，也避免了需要关闭一些提示
#                           （这些方案一定是基于业务与实际情况给出的具体方案）
#           登录成功，使得网站具备了登录状态，这时如果后续用例需要登录态，那么你就不用注销。
#           如果后续用例不需要登录态，那你就必须去注销。访问登录页，如果title是登录，就说明没有登录状态，反之。
#       提供完整的结束操作（后置）：
#           例如断言，这个其实是PO设计模式和参数化最难解决的一个问题，比如登录，登录失败应该断言什么？
#           登录失败应该断言提示，登录成功应该断言昵称或者title都可以。但是，你会发现都不一样
#
# 意义：po设计模式的目的在于：
# 1.通过面向对象的封装，可以划分功能页面，方便维护
# 2.不同功能封装为用例函数，方便复用
# 比如同样的用例，使用不同的数据反复测试（参数化）
# 3.分离数据，方便自动化维护
from class11.keywords import Web

# 这是打开浏览器的关键字封装后的效果
web = Web()
web.openbrowser()

# 手机号登录失败
web.geturl('http://testingedu.com.cn:8000/Home/user/login.html')
# 定位元素-操作元素
web.input('//*[@id="username"]', '13800138006')
web.input('password', '1234567')
web.input('//*[@id="verify_code"]', '1111')
web.click('//*[@id="loginform"]/div/div[6]/a')

# 断言
msg = web.gettext('//div[@id="layui-layer1"]/div[2]')
assert msg.__contains__("密码错误!")

# 手机号登录成功
web.geturl('http://testingedu.com.cn:8000/Home/user/login.html')
if not web.driver.title.__contains__('登录'):
    # 这里就应该注销
    web.click('//a[text()="安全退出"]')
    web.geturl('http://testingedu.com.cn:8000/Home/user/login.html')
# 定位元素-操作元素
web.input('//*[@id="username"]', '13800138006')
web.input('password', '123456')
web.input('//*[@id="verify_code"]', '1111')
web.click('//*[@id="loginform"]/div/div[6]/a')

# 断言
msg = web.gettext('//a[@class="red userinfo"]')
assert msg


# 邮箱号登录失败
web.geturl('http://testingedu.com.cn:8000/Home/user/login.html')
if not web.driver.title.__contains__('登录'):
    # 这里就应该注销
    web.click('//a[text()="安全退出"]')
    web.geturl('http://testingedu.com.cn:8000/Home/user/login.html')
# 定位元素-操作元素
web.input('//*[@id="username"]', '123@qq.com')
web.input('password', '1234567')
web.input('//*[@id="verify_code"]', '1111')
web.click('//*[@id="loginform"]/div/div[6]/a')

# 断言
msg = web.gettext('//div[@id="layui-layer1"]/div[2]')
assert msg.__contains__("密码错误!")


# 邮箱号登录成功
web.geturl('http://testingedu.com.cn:8000/Home/user/login.html')
if not web.driver.title.__contains__('登录'):
    # 这里就应该注销
    web.click('//a[text()="安全退出"]')
    web.geturl('http://testingedu.com.cn:8000/Home/user/login.html')
# 定位元素-操作元素
web.input('//*[@id="username"]', '123@qq.com')
web.input('password', '123456')
web.input('//*[@id="verify_code"]', '1111')
web.click('//*[@id="loginform"]/div/div[6]/a')
# 断言
msg = web.gettext('//a[@class="red userinfo"]')
assert msg